/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package view.prompt;

import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import model.dominio.Cliente;
import model.dominio.Locacao;
import model.dominio.Motorista;
import model.dominio.Veiculo;
import utilitario.Console;
import utilitario.ManipularArquivo;
import utilitario.ValidaException;
import view.ViewTipoVeiculo;
import java.util.Date;
import model.dao.DaoCliente;
import model.dao.DaoLocacao;
import view.ViewVeiculo;

/**
 *
 * @author Rodrigo
 */
public class ViewLocacaoPrompt {

    public static Locacao preencherLocacao() {
        Locacao locacao = new Locacao();
        Cliente cliente;
        Motorista m;
        Veiculo veiculo;
        String cpf, cnh, dataSaida;
        int tipoVeiculo = 0, codigoVeiculo = 0, dias = 0, tipoLocacao;
        long kmSaida = 0;
        char confirma;

        try {

            System.out.println("================Cadastrar Locação================");
            System.out.println("Digite o cpf do cliente que deseja efetuar a locação:");

            cpf = Console.readString();

            cliente = DaoCliente.buscarCliente("cpf", cpf);

            locacao.setCliente(cliente);
            do{
            System.out.println("Selecione o tipo de carro que deseja locar:");
            ViewTipoVeiculo.imprimeLista();
            tipoVeiculo = Console.readInteger();
            }while(ViewVeiculoPrompt.listarVeiculosLocacao(tipoVeiculo)==0);
            System.out.println("Selecione o carro que deseja locar:");
            codigoVeiculo = Console.readInteger();
            veiculo = Veiculo.stringToObject(ManipularArquivo.buscarNoArquivo(Veiculo.class.getName(), "codigo", codigoVeiculo + ""));
            locacao.setVeiculo(veiculo);

            System.out.println("Selecione o tipo de locação:");
            System.out.println("1 - Km Livre");
            System.out.println("2 - Diária + preço p/km");
            do {
                tipoLocacao = Console.readInteger();
            } while (tipoLocacao != 1 && tipoLocacao != 2);
            locacao.setTipoLocacao(tipoLocacao);
            System.out.println("Digite a kilometragem atual do veículo:");
            kmSaida = Console.readLong();
            locacao.setKmSaida(kmSaida);

            System.out.println("Confirma a data de hoje como data da locação? [S/N]");
            confirma = Console.readChar();
            confirma = Character.toLowerCase(confirma);
            dataSaida = new Date().toLocaleString();
            if (confirma == 'n') {
                System.out.println("Digite a data da locação (DD/MM/AAAA):");
                do {
                    dataSaida = Console.readString();
                } while (dataSaida.equals(""));
            }

            locacao.setDataSaida(dataSaida);

            System.out.println("Digite a previsão de dias de locação do veículo:");
            do {
                dias = Console.readInteger();
            } while (dias == 0);
            locacao.setPrevisaoDias(dias);

            System.out.println("Confirma o mesmo cliente como motorista? [S/N]");
            confirma = Console.readChar();
            confirma = Character.toLowerCase(confirma);
            if (confirma == 's') {

                System.out.println("Digite a CNH do cliente:");
                do {
                    cnh = Console.readString();
                } while (cnh == null);
                m = new Motorista(cliente.getNome(), cliente.getCpf(), cnh);//reaproveitando os mesmo dados do cliente para 
                m.setCodigo(ManipularArquivo.salvarNoArquivo(m));
                locacao.addMotorista(m);

            } else {
                m = ViewMotoristaPrompt.cadastraMotorista();
                locacao.addMotorista(m);
            }

            do {
                System.out.println("Deseja cadastrar mais algum motorista? [S/N]");
                do {
                    confirma = Console.readChar();
                    confirma = Character.toLowerCase(confirma);
                } while (confirma != 's' && confirma != 'n');
                if (confirma == 's') {
                    m = ViewMotoristaPrompt.cadastraMotorista();
                    locacao.addMotorista(m);
                }

            } while (confirma == 's');
            return locacao;
        } catch (ValidaException ex) {
            System.out.println(ex.getMessage());
            return preencherLocacao();
        }
    }

    public static Locacao registrarDevolucao() {
        Locacao locacao;
        Veiculo veiculo;
        Cliente cliente;
        String cpf;
        String dataDevolucao;
        char confirma;
        int v = 0;
        long kmDevolucao = 0;
        try {
            System.out.println("================Registrar Devolução================");
            System.out.println("Digite o cpf do cliente:");
            cpf = Console.readString();

            cliente = Cliente.stringToObject(ManipularArquivo.buscarNoArquivo(Cliente.class.getName(), "cpf", cpf));

            ArrayList<Locacao> locacoes = DaoLocacao.buscarLocacoesAbertas(cliente);

            if (locacoes.size() > 1) {
                for (int i = 0; i < locacoes.size(); i++) {
                    locacao = locacoes.get(i);
                    veiculo = locacao.getVeiculo();
                    System.out.println((i + 1) + " - " + veiculo.getModelo() + " - " + veiculo.getMarca() + " - " + veiculo.getPlaca());
                }

                do {
                    v = Console.readInteger();
                } while (!(v > 0));
                v = v - 1;
            } else if (locacoes.isEmpty()) {
                throw new ValidaException("Nenhuma locação cadastrada para esse cliente");
            }
            locacao = locacoes.get(v);
            System.out.println("Confirma a data de hoje como data da devolução? [S/N]");
            confirma = Console.readChar();
            confirma = Character.toLowerCase(confirma);
            dataDevolucao = new Date().toLocaleString();
            if (confirma == 'n') {
                System.out.println("Digite a data da devolucao (DD/MM/AAAA):");
                do {
                    dataDevolucao = Console.readString();
                } while (dataDevolucao.equals(""));
            }
            locacao.setDataDevolucao(dataDevolucao);

            System.out.println("Digite a quilometragem do carro:");
            do {
                kmDevolucao = Console.readLong();
            } while (kmDevolucao <= 0);
            locacao.setKmEntrada(kmDevolucao);
            double valorLocacao = 0, taxa, valorKm;
            int diffDias = locacao.getDiferencaDiasDevolucao();
            valorKm = locacao.getVeiculo().getTipo().getPrecoKm();
            if (locacao.getTipoLocacao() == 1) {
                taxa = locacao.getVeiculo().getTipo().getTaxaUnica();
                System.out.println(taxa + " - " + diffDias);
                valorLocacao = taxa * diffDias;
            } else {
                taxa = locacao.getVeiculo().getTipo().getPrecoBase();
                valorLocacao = (taxa * diffDias) + (valorKm * locacao.getKmRodados());
            }
            DecimalFormat nf = new DecimalFormat("###,###.00");
            locacao.setValorLocacao(valorLocacao);
            System.out.println("O valor da locacao é R$ " + nf.format(valorLocacao));

            System.out.println("Confirma o registro da devolução? [S/N]");
            confirma = Console.readChar();
            confirma = Character.toLowerCase(confirma);
            if (confirma == 's') {
                return locacao;
            } else {
                return null;
            }
        } catch (ValidaException ex) {
            System.out.println(ex.getMessage());
            return null;
        }
    }

    public static void listarLocacoesFinalizadas() {

        char confirma = 'n';
        System.out.println("Deseja informar um periodo para a pesquisa? [S/N]");
        confirma = Console.readChar();
        confirma = Character.toLowerCase(confirma);
        ArrayList<Locacao> locacoes;
        if (confirma == 's') {
            String dataInicial, dataFinal;
            System.out.println("Digite a data inicial do periodo: (DD/MM/AAAA)");
            do {
                dataInicial = Console.readString();
            } while (dataInicial.equals(""));
            System.out.println("Digite a data final do periodo: (DD/MM/AAAA)");
            do {
                dataFinal = Console.readString();
            } while (dataFinal.equals(""));
            locacoes = DaoLocacao.buscarLocacoesFinalizadas(new Date(dataInicial), new Date(dataFinal));

        } else {
            locacoes = DaoLocacao.buscarLocacoesFinalizadas();
        }

        DecimalFormat nf = new DecimalFormat("###,###.00");
        System.out.println("\nCPF || NOME || TIPO DE LOCACAO || DATA DE SAIDA || DATA DE DEVOLUÇÃO || KILOMETROS RODADOS || VALOR DA LOCAÇÃO\n");
        Cliente c;
        String[] data1, data2;
        String tipoLocacao;
        for (Locacao locacao : locacoes) {
            c = locacao.getCliente();
            data1 = locacao.getDataSaida().toLocaleString().split(" ");
            data2 = locacao.getDataDevolucao().toLocaleString().split(" ");
            tipoLocacao = "Quilometragem livre";
            if (locacao.getTipoLocacao() == 2) {
                tipoLocacao = "Diária + Preço p/km";
            }
            
            
            System.out.println(c.getCpf() + " || " + c.getNome() + " || " + tipoLocacao + " || " + data1[0] + " || " + data2[0] + " || " + locacao.getKmRodados() + " || R$" + nf.format(locacao.getValorLocacao()));
        }
        System.out.println("\nPressione enter para voltar ao menu principal");
        try {
            System.in.read();
        } catch (IOException ex) {
            // Logger.getLogger(ViewLocacaoPrompt.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public static void listarLocacoesEmAberto() {

        char confirma = 'n';
        System.out.println("Deseja informar um periodo para a pesquisa? [S/N]");
        confirma = Console.readChar();
        confirma = Character.toLowerCase(confirma);
        ArrayList<Locacao> locacoes;
        if (confirma == 's') {
            String dataInicial, dataFinal;
            System.out.println("Digite a data inicial do periodo: (DD/MM/AAAA)");
            do {
                dataInicial = Console.readString();
            } while (dataInicial.equals(""));
            System.out.println("Digite a data final do periodo: (DD/MM/AAAA)");
            do {
                dataFinal = Console.readString();
            } while (dataFinal.equals(""));
            locacoes = DaoLocacao.buscarLocacoesAbertas(new Date(dataInicial), new Date(dataFinal));

        } else {
            locacoes = DaoLocacao.buscarLocacoesAbertas();
        }

        DecimalFormat nf = new DecimalFormat("###,###.00");
        System.out.println("\nCPF || NOME || TIPO DE LOCACAO || DATA DE SAIDA || DATA DE DEVOLUÇÃO || KILOMETROS RODADOS || VALOR DA LOCAÇÃO\n");
        Cliente c;
        String[] data1;
        String tipoLocacao;
        for (Locacao locacao : locacoes) {
            c = locacao.getCliente();
            locacao.setDataDevolucao(new Date().toLocaleString());
            data1 = locacao.getDataSaida().toLocaleString().split(" ");
            
            tipoLocacao = "Quilometragem livre";
            if (locacao.getTipoLocacao() == 2) {
                tipoLocacao = "Diária + Preço p/km";
            }
            locacao.setDataDevolucao(new Date().toLocaleString());
            double valorLocacao = 0, taxa, valorKm;
            int diffDias = locacao.getDiferencaDiasDevolucao();
            valorKm = locacao.getVeiculo().getTipo().getPrecoKm();
            if (locacao.getTipoLocacao() == 1) {
                taxa = locacao.getVeiculo().getTipo().getTaxaUnica();
                valorLocacao = taxa * diffDias;
            } else {
                taxa = locacao.getVeiculo().getTipo().getPrecoBase();
                locacao.setKmEntrada(locacao.getKmSaida()+(diffDias * 80));
                valorLocacao = (taxa * diffDias) + (valorKm * locacao.getKmRodados());
            }
            System.out.println(c.getCpf() + " || " + c.getNome() + " || " + tipoLocacao + " || " + data1[0] + " || ----------- || ------------- || R$" + nf.format(valorLocacao));
        }
        System.out.print("\nPressione enter para voltar ao menu principal");
        try {
            System.in.read();
        } catch (IOException ex) {
            // Logger.getLogger(ViewLocacaoPrompt.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void listarVeiculosLocacaoQuantidade(ArrayList<Veiculo> veiculos) {
        System.out.println("Veículo = Nº de Locações");
        for (Veiculo veiculo : veiculos) {
            System.out.println(veiculo.getMarca() + " " + veiculo.getModelo() + " " + veiculo.getCor() + " - " + veiculo.getPlaca()+ " = "+veiculo.getLocacoes().size());
        }
    }
    public static void listarVeiculosLocacaoValor(ArrayList<Veiculo> veiculos) {
        System.out.println("Veículo = Valor Total das Locações");
        double valor=0;
        
        DecimalFormat nf = new DecimalFormat("###,###.00");
        for (Veiculo veiculo : veiculos) {
            valor =0;
            for(Locacao l:veiculo.getLocacoes()){
                valor+=l.getValorLocacao();
            }
            System.out.println(veiculo.getMarca() + " " + veiculo.getModelo() + " " + veiculo.getCor() + " - " + veiculo.getPlaca()+ " = R$"+nf.format(valor));
        }
    }

    public static int menuLocacao() {
        System.out.println("=====================Locação=====================");
        System.out.println("1 - Registrar Locaçao");
        System.out.println("2 - Registrar Devolução");
        System.out.println("3 - Relatório de Locações Finalizadas");
        System.out.println("4 - Relatório de Locações em Aberto");
        System.out.println("5 - Relatório de Locações por veiculo");
        System.out.println("6 - Relatório de Arrecadação por veiculo");
        System.out.println("0 - Voltar ao Menu Principal");
        return Console.readInteger();
    }
}
